🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / common / src / commonMain / kotlin / org / meshtastic / core / common / util / NumberFormatter.kt
Displaying Raw • Download
core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/NumberFormatter.kt 3796787cdfdf741db05a2d48aba32bc32275925b (3796787c) Text, 3.75 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.common.util
Tff7b72import T7ee787kotlin.math.pow
Tff7b72import T7ee787kotlin.math.roundToLong
T8b949e/** Pure Kotlin number formatting utility — no expect/actual needed. */
Tff7b72object T56d364NumberFormatter Tb4b4b4{
T8b949e/** Formats a double value with the specified number of decimal places. */
Tff7b72fun Td2a8ffformatTb4b4b4(Te6edf3valueTb4b4b4: Tffa657DoubleTb4b4b4, Te6edf3decimalPlacesTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3valueTb4b4b4.Te6edf3isNaNTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3valueTb4b4b4.Te6edf3isInfiniteTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return Ta5d6ff"Ta5d6ff—Ta5d6ff"
Tff7b72val Te6edf3factor Tff7b72= T79c0ff1T79c0ff0.0Tb4b4b4.Te6edf3powTb4b4b4(Te6edf3decimalPlacesTb4b4b4)
Tff7b72val Te6edf3rounded Tff7b72= Tb4b4b4(Te6edf3value Tff7b72* Te6edf3factorTb4b4b4)Tb4b4b4.Te6edf3roundToLongTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3formatFixedPointTb4b4b4(Te6edf3roundedTb4b4b4, Te6edf3decimalPlacesTb4b4b4)
Tb4b4b4}
T8b949e/** Formats a float value with the specified number of decimal places. */
Tff7b72fun Td2a8ffformatTb4b4b4(Te6edf3valueTb4b4b4: Tffa657FloatTb4b4b4, Te6edf3decimalPlacesTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3valueTb4b4b4.Te6edf3isNaNTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3valueTb4b4b4.Te6edf3isInfiniteTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return Ta5d6ff"Ta5d6ff—Ta5d6ff"
Tff7b72return Te6edf3formatTb4b4b4(Te6edf3valueTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3decimalPlacesTb4b4b4)
Tb4b4b4}
T8b949e/**
* Parses a user-entered decimal whose separator follows the keyboard locale — `48,21` on a comma locale, which
* [String.toDoubleOrNull] rejects. A lone separator is always the decimal mark; grouping is only recognised when
* more than one appears, in which case the last one is the decimal mark. Returns null for anything unparseable.
*/
Tff7b72fun Td2a8ffparseDecimalOrNullTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Double? Tb4b4b4{
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3textTb4b4b4.Te6edf3filterNot Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isWhitespaceTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Tffa657it Tff7b72=Tff7b72= Ta5d6ff' ' Tff7b72|Tff7b72| Tffa657it Tff7b72=Tff7b72= Ta5d6ff' ' Tff7b72|Tff7b72| Tffa657it Tff7b72=Tff7b72= Ta5d6ff'\'' Tb4b4b4}
Tff7b72val Te6edf3lastSeparator Tff7b72= Te6edf3strippedTb4b4b4.Te6edf3indexOfLast Tb4b4b4{ Tffa657it Tff7b72in Te6edf3DECIMAL_SEPARATORS Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3lastSeparator Tff7b72< T79c0ff0Tb4b4b4) Tff7b72return Te6edf3strippedTb4b4b4.Te6edf3toDoubleOrNullTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3integerPart Tff7b72= Te6edf3strippedTb4b4b4.Te6edf3takeTb4b4b4(Te6edf3lastSeparatorTb4b4b4)Tb4b4b4.Te6edf3filterNot Tb4b4b4{ Tffa657it Tff7b72in Te6edf3DECIMAL_SEPARATORS Tb4b4b4}
Tff7b72return Ta5d6ff"Tffd700$Te6edf3integerPartTa5d6ff.Tffd700${Te6edf3strippedTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3lastSeparator Tff7b72+ T79c0ff1Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4.Te6edf3toDoubleOrNullTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffformatFixedPointTb4b4b4(Te6edf3scaledValueTb4b4b4: Tffa657LongTb4b4b4, Te6edf3decimalPlacesTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3decimalPlaces Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return Te6edf3scaledValueTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3isNegative Tff7b72= Te6edf3scaledValue Tff7b72< T79c0ff0
Tff7b72val Te6edf3abs Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isNegativeTb4b4b4) Tff7b72-Te6edf3scaledValue Tff7b72else Te6edf3scaledValue
Tff7b72val Te6edf3factor Tff7b72= T79c0ff1T79c0ff0.0Tb4b4b4.Te6edf3powTb4b4b4(Te6edf3decimalPlacesTb4b4b4)Tb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3intPart Tff7b72= Te6edf3abs Tff7b72/ Te6edf3factor
Tff7b72val Te6edf3fracPart Tff7b72= Te6edf3abs Tff7b72% Te6edf3factor
Tff7b72val Te6edf3sign Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isNegativeTb4b4b4) Ta5d6ff"Ta5d6ff-Ta5d6ff" Tff7b72else Ta5d6ff"Ta5d6ff"
Tff7b72return Ta5d6ff"Tffd700$Te6edf3signTffd700$Te6edf3intPartTa5d6ff.Tffd700${Te6edf3fracPartTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(Te6edf3decimalPlacesTb4b4b4, Ta5d6ff'0'Tb4b4b4)Tffd700}Ta5d6ff"
Tb4b4b4}
T8b949e/** True when [char] is a decimal mark reachable from a `Decimal`/`DecimalSigned` keyboard. */
Tff7b72fun Td2a8ffisDecimalSeparatorTb4b4b4(Te6edf3charTb4b4b4: Tffa657CharTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Te6edf3char Tff7b72in Te6edf3DECIMAL_SEPARATORS
T8b949e/**
* True when [text] could still become a number as the user types — an empty field, a lone sign, or a trailing
* separator. A controlled field consults this after [parseDecimalOrNull] returns null, so transient input like `-`
* or `-.` survives on the way to `-1.5` instead of snapping back to the last committed value.
*/
Tff7b72fun Td2a8ffisPartialDecimalTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72=
Te6edf3textTb4b4b4.Te6edf3removePrefixTb4b4b4(Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3all Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isDigitTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3isDecimalSeparatorTb4b4b4(Tffa657itTb4b4b4) Tff7b72|Tff7b72| Tffa657itTb4b4b4.Te6edf3isWhitespaceTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Tffa657it Tff7b72=Tff7b72= Ta5d6ff'\'' Tb4b4b4}
T8b949e/** Decimal marks reachable from a `Decimal`/`DecimalSigned` keyboard, across keyboard locales. */
Tff7b72private Tff7b72val Te6edf3DECIMAL_SEPARATORS Tff7b72= Te6edf3setOfTb4b4b4(Ta5d6ff'.'Tb4b4b4, Ta5d6ff','Tb4b4b4, Ta5d6ff'٫'Tb4b4b4, Ta5d6ff'、'Tb4b4b4, Ta5d6ff'·'Tb4b4b4)
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.05s